// 数据处理类，可根据工程配置。
// Data processing class, can be configured according to the project.

import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';

import type { AjaxResult, RequestOptions } from '#/request';

/** 创建Axios选项 */
export interface CreateAxiosOptions extends AxiosRequestConfig {
  /** 身份验证键 */
  authenticationKey?: string;
  /** 身份验证方案 */
  authenticationScheme?: string;
  /** 请求转换器 */
  transform?: AxiosTransform;
  /** 请求参数 */
  requestOptions?: RequestOptions;
}

/** 请求转换器 */
export abstract class AxiosTransform {
  /** 在发送请求之前调用的函数，它可以根据需要修改请求配置。 */
  beforeRequestHook?: (
    config: AxiosRequestConfig,
    options: RequestOptions,
  ) => AxiosRequestConfig | Promise<AxiosRequestConfig>;
  /** 请求失败处理 */
  requestCatchHook?: (axiosInstance: AxiosInstance, e: Error) => any | Promise<any>;
  /** 请求拦截器 */
  requestInterceptors?: (config: InternalAxiosRequestConfig, options: CreateAxiosOptions) => InternalAxiosRequestConfig;
  /** 请求拦截器错误处理 */
  requestInterceptorsCatch?: (error: Error) => any | Promise<any>;
  /** 响应结果拦截器 */
  responseInterceptors?: (
    axiosInstance: AxiosInstance,
    res: AxiosResponse<any>,
  ) => AxiosResponse<any> | Promise<AxiosResponse<any>>;
  /** 响应结果拦截器错误处理 */
  responseInterceptorsCatch?: (axiosInstance: AxiosInstance, error: Error) => any | Promise<any>;
  /** 处理响应数据 */
  transformResponseHook?: (res: AxiosResponse<AjaxResult>, options: RequestOptions) => any | Promise<any>;
}
